#ifndef QQTDATASTRUCT_H
#define QQTDATASTRUCT_H

#include <QObject>

#include <qqtdicthelper.h>
#include <qqthighgrade_global.h>

#define QQtDeclareMember(type, member) \
public: \
    type& member() { return m_##member; } \
    const type& member() const { return m_##member; } \
private: \
    type m_##member;

/**
 * @brief The QQtDataStruct class
 * LibQQt提供的Qt C++数据结构类和字典的转换父类
 *
 * Struct - Dict
 *
 * 使用方法：
 * 用户继承下去实现toDict(), fromDict(), 获取成员变量，打包成员变量
 */
class QQTHIGHGRADESHARED_EXPORT QQtDataStruct : public QObject
{
    Q_OBJECT

public:
    explicit QQtDataStruct ( QObject* parent = 0 )
        : QObject ( parent ) {}
    virtual ~QQtDataStruct() {}

    /**
     * 不必继承
     */

    //把成员变量pack进字典。
    //!2
    virtual void toDict ( QQtDictionary& dict ) {
        QQtOrderedDictionary d1;
        toDict ( d1 );
        dict = d1;
    }
    //从字典里解出成员变量。
    //!3
    virtual void fromDict ( QQtDictionary& dict ) {
        QQtOrderedDictionary d1 = dict;
        fromDict ( d1 );
    }

    /**
     * 用户继承这两个不排序的字典函数实现pack、parse。
     */

    //是否带排序的字典，二选一；
    virtual void toDict ( QQtOrderedDictionary& dict ) {
#if 0
        dict["size"] = size();
        dict["data"] = data().toBase64();
        dict["tail"] = tail();
#endif
    }
    virtual void fromDict ( QQtOrderedDictionary& dict ) {
#if 0
        size() = dict["size"].getValue().toInt();
        data() = QByteArray::fromBase64 ( dict["data"].getValue().toByteArray() );
        tail() = dict["tail"].getValue().toInt();
#endif
    }

    //!4 用户可以把获取到的字典转成json、xml等数据结构发出，
    //! this->toDict(dict);
    //! dict.toJson(4);
    //! 也可以把收到的json、xml等数据结构本地化到局部变量使用。
    //! dict.fromJson();
    //! this->fromDict(dict);
    //! 用户使用排序的字典、不排序的字典都可以。

#if 0
    //!1 example
public:
    quint8& size() { return m_size; }
    const quint8& size() const { return m_size; }
private:
    quint8 m_size;

    //!1 方便函数
    QQtDeclareMember ( QByteArray, data )
    QQtDeclareMember ( quint8, tail )
#endif
};

#endif // QQTDATASTRUCT_H

